package com.yc.cloud.oss.service;

import java.io.File;
import java.nio.file.Path;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yc.cloud.basic.dto.BaseQueryParam;
import com.yc.cloud.entity.OssFile;
import com.yc.cloud.oss.dto.request.OssCreateDirParam;
import com.yc.cloud.oss.dto.request.OssFileMove2DirParam;
import com.yc.cloud.oss.dto.request.OssGetChunkParam;
import com.yc.cloud.oss.dto.request.OssListParam;
import com.yc.cloud.oss.dto.request.OssUpdateCoverParam;
import com.yc.cloud.oss.dto.request.OssUpdateDirParam;
import com.yc.cloud.oss.dto.request.OssUpdateParam;
import com.yc.cloud.oss.dto.request.OssUploadBase64Param;
import com.yc.cloud.oss.dto.request.OssUploadChunkParam;
import com.yc.cloud.oss.dto.request.OssUploadParam;
import com.yc.cloud.oss.vo.GetChunkVo;
import com.yc.cloud.oss.vo.OssFileVo;

/**
 * <p>
 * 文件 服务类
 * </p>
 *
 * @author Yancy
 * @since 2023-12-25
 */
public interface OssFileService extends IService<OssFile> {

    /***
     * description:查询列表
     *
     * @param ossListParam
     * @param param 查询条件
     * @return 数据信息
     */
    IPage<OssFileVo> list(OssListParam ossListParam, BaseQueryParam param);

    OssFileVo upload(MultipartFile file, OssUploadParam param);

    OssFileVo getByFileId(String fileid);

    boolean deleteByFileId(String fileid);

    String getFilePath(String bucketName, String folder, boolean rename, String fileName);

    OssFile saveOssFile(String path);

    boolean saveBatchOssFiles(List<String> path);

    OssFile getByFileIdFromDb(String fileId);

    String generateFileId();

    OssFile buildOssFile(String fileId, String fileName, String path);

    String getOssFileUrl(String fileid);

    /**
     * 分块上传大文件
     *
     * @param param 文件标识、文件数据等信息
     * @param file  分块文件
     * @return 成功 or 失败
     */
    boolean uploadChunk(MultipartFile file, OssUploadChunkParam param);

    /**
     * 获取当前文件已经上传的块数
     *
     * @param param 文件唯一标识
     * @return 第几块
     */
    GetChunkVo getChunk(OssGetChunkParam param);

    OssFileVo uploadByBase64(OssUploadBase64Param param);


    void filterFilesAndSaveBatch(List<File> files);

    /**
     * 合并分块文件
     *
     * @param mergedFilePath 合并路径
     * @return
     */
    boolean mergeFileChunks(Path mergedFilePath, String bucName, String fileId);

    OssFileVo createDir(OssCreateDirParam param);

    OssFileVo updateDir(String fileId, OssUpdateDirParam param);

    boolean moveFiles2Dir(OssFileMove2DirParam param);

    boolean updateByFileId(String fileId, OssUpdateParam param);

    boolean updateCover(String fileid, MultipartFile file, OssUpdateCoverParam param);

    /**
     * 根据fileId批量查询
     *
     * @param fileIdList fileId集合对象
     * @return 文件列表
     */
    List<OssFile> listByFileIds(List<String> fileIdList);

        /**
     * 根据fileId批量查询
     *
     * @param fileIdList fileId集合对象
     * @return 文件列表
     */
    List<OssFileVo> listOssFileVoByFileIds(List<String> fileIdList);

    OssFileVo convertVo(OssFile ossFile);

    /**
     * 根据文件扩展名查询文件列表
     *
     * @param fileExtension 文件扩展名
     * @return 文件列表
     * @author YC
     * @date 2021-08-26 10:50:28
     */
    List<OssFile> listByFileExtension(String fileExtension);

    /**
     * 根据文件ID批量删除
     * @param ossFileIds 文件ID列表
     * @return 是否删除成功
     */
    boolean removeBatchByFileIds(List<String> ossFileIds);
}

